/**
 * @(#)KalendereintragImpl.java
 * 1.0, 2013-01-24
 */
package de.hdm.gruppenkalender.team04.data;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.D1EB27D4-2488-889F-2686-B3ADA510B65C]
// </editor-fold>
/**
 * Implementierungsklasse des Interface {@link Kalendereintrag}
 *
 * @author Mathias Bendel (mb167)
 * @author Björn Fichnter (bf023)
 * @author Stefan Hettich (sh176)
 * @author René Kugel (rk044)
 * @author Mark Leonberger (ml072)
 * @author Marta Przybylski (mp070)
 *
 * @version 1.0, 2013-01-24
 *
 * @see Kalendereintrag
 */
public class KalendereintragImpl extends UnicastRemoteObject implements
        Kalendereintrag {

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.F58DC0BF-CF2E-E21F-85A1-21D9E866BC1F]
    // </editor-fold> 
    /**
     * beinhaltet die kalendereintragId
     */
    private int kalendereintragId;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.E5AB91F8-BF3F-1486-CEDD-7DAE07D4DCD7]
    // </editor-fold> 
    /**
     * beinahltet das Startdatum des Kalendereintrag
     */
    private Timestamp start;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.D8799425-4585-214D-8BAC-3B7AE54DB25F]
    // </editor-fold> 
    /**
     * beinhaltet das Enddatum des Kalendereintrag
     */
    private Timestamp ende;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.59929168-5D30-FB1C-B05E-9CA51C7058EB]
    // </editor-fold> 
    /**
     * beinahltet den titel des Kalendereintrag
     */
    private String titel;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.E8D4BFFD-989C-7581-D147-85DD2FC539BF]
    // </editor-fold> 
    /**
     * beinhaltet eine beschreibung des Orts des Kalendereintrag
     */
    private String ort;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.0BEF85DB-3EEB-B2E8-C304-7E0F68BDDB69]
    // </editor-fold> 
    /**
     * beinhaltet die Beschreibung des Kalendereintrag
     */
    private String beschreibung;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.DB97CCC2-2D01-65CA-97DA-472E2D4971C7]
    // </editor-fold> 
    /**
     * beinhaltet die verknüpfung zur erinnerungId
     */
    private int erinnerungId;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.C494A4C0-FBE4-6657-AAB8-BEB0F1A77759]
    // </editor-fold> 
    /**
     * beinahltet die Kategorie des kalendereintrag
     */
    private int kategorieId;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.B8BA2289-636E-D94F-AD65-D4DD82B26297]
    // </editor-fold> 
    /**
     * beinhaltet den erstellerId des Kalendereintrag
     */
    private int erstellerId;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.DAB3E3D1-53B8-AFD3-1922-C39B751BC1D1]
    // </editor-fold> 
    /**
     * beinhaltet das Kalenderobjekt
     */
    private int kalenderId;

    public KalendereintragImpl() throws RemoteException {
        super();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.22D91941-157B-3EFA-4A2B-1493B55B65C7]
    // </editor-fold> 
    /**
     * Gibt die ID des {@link Kalendereintrag} zurück.
     *
     * @return  int             id
     * @throws  RemoteException
     */
    public int getId() throws RemoteException {
        return this.kalendereintragId;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.9769DD08-8506-EFDB-6EEB-EF186D7A2FDE]
    // </editor-fold> 
    /**
     * Setzt eine neue ID des {@link Kalendereintrag}.
     *
     * @param   id
     * @throws  RemoteException
     */
    public void setId(int id) throws
            RemoteException {
        this.kalendereintragId = id;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.AB99C4A7-231B-8EA5-84B3-9985F819C55A]
    // </editor-fold> 
    /**
     * Gibt den Start-Zeitpunkt des {@link Kalendereintrag}s zurück.
     *
     * @return  Timestamp       start
     * @throws  RemoteException
     */
    public Timestamp getStart() throws RemoteException {
        return this.start;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.D6C74629-56A9-A8DA-E194-0A530C4CF3A0]
    // </editor-fold> 
    /**
     * Setzt einen neuen Start-Zeitpunkt.
     *
     * @param   start
     * @throws  RemoteException
     */
    public void setStart(Timestamp start) throws RemoteException {
        this.start = start;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.0D20D07C-D907-F51F-111D-23B5648F8D5B]
    // </editor-fold> 
    /**
     * Gibt den End-Zeitpunkt des {@link Kalendereintrag}s zurück.
     *
     * @return  Timestamp       ende
     * @throws  RemoteException
     */
    public Timestamp getEnde() throws RemoteException {
        return this.ende;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.A2A13F31-1F9C-9D69-A503-66A283B7DE8F]
    // </editor-fold> 
    /**
     * Setzt einen neuen End-Zeitpunkt.
     *
     * @param   ende
     * @throws  RemoteException
     */
    public void setEnde(Timestamp ende) throws RemoteException {
        this.ende = ende;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.D0B6D6E8-ED32-79D0-E811-EB32089973BE]
    // </editor-fold> 
    /**
     * Gibt den Titel des {@link Kalendereintrag}s zurück.
     *
     * @return  String          titel
     * @throws  RemoteException
     */
    public String getTitel() throws RemoteException {
        return this.titel;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.01A7FE62-C719-FB00-FB4C-85585B404667]
    // </editor-fold> 
    /**
     * Setzt einen neuen Titel.
     *
     * @param   titel
     * @throws  RemoteException
     */
    public void setTitel(String titel) throws RemoteException {
        this.titel = titel;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.4D6043F9-51E6-47E1-1CFB-8379020F19E8]
    // </editor-fold> 
    /**
     * Gibt den Ort des {@link Kalendereintrag}s zurück.
     *
     * @return  String          ort
     * @throws  RemoteException
     */
    public String getOrt() throws RemoteException {
        return this.ort;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.275CAEAB-B20A-9F7F-1466-F7DD3C4FB109]
    // </editor-fold> 
    /**
     * Setzt einen neuen Ort.
     *
     * @param   ort
     * @throws  RemoteException
     */
    public void setOrt(String ort) throws RemoteException {
        this.ort = ort;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.50F2AC20-1F43-3DB0-E7C1-B2D837836F3A]
    // </editor-fold> 
    /**
     * Gibt die Beschreibung des {@link Kalendereintrag}s zurück.
     *
     * @return  String          beschreibung
     * @throws  RemoteException
     */
    public String getBeschreibung() throws RemoteException {
        return this.beschreibung;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.3B938265-A5EE-546D-1F0C-759D93241287]
    // </editor-fold> 
    /**
     * Setzt eine neue Beschreibung
     *
     * @param   beschreibung
     * @throws  RemoteException
     */
    public void setBeschreibung(String beschreibung) throws RemoteException {
        this.beschreibung = beschreibung;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.08B2A1F6-7F59-CB6D-37A8-FF6621C89FBE]
    // </editor-fold> 
    /**
     * Gibt die ID der verknüpften {@link Alarm} zurück.
     *
     * @return  int             erinnerungId
     * @throws  RemoteException
     */
    public int getErinnerungId() throws RemoteException {
        return this.erinnerungId;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.553E8C1E-C4A3-EDDD-920D-BE3989FC4775]
    // </editor-fold> 
    /**
     * Setzt eine neue {@link Alarm}-ID.
     *
     * @param   erinnerungId
     * @throws  RemoteException
     */
    public void setErinnerungId(int erinnerungId) throws RemoteException {
        this.erinnerungId = erinnerungId;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.B893D6B5-48D7-C8CC-E9BA-F4F7FBFF95E4]
    // </editor-fold> 
    /**
     * Gibt die ID der verknüpften {@link Kategorie} zurück.
     *
     * @return  int             kategorieId
     * @throws  RemoteException
     */
    public int getKategorieId() throws RemoteException {
        return this.kategorieId;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.90F61CDB-B248-7220-3AF1-E555B3C75AAF]
    // </editor-fold> 
    /**
     * Setzt eine neue {@link Kategorie}-ID.
     *
     * @param   kategorieId
     * @throws  RemoteException
     */
    public void setKategorieId(int kategorieId) throws RemoteException {
        this.kategorieId = kategorieId;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.5742B8A2-DCA8-9AEA-9BF5-3FB5C8E2610F]
    // </editor-fold> 
    /**
     * Gibt die ID der {@link Person} zurück, die den {@link Alarm} erstellt
     * hat zurück.
     *
     * @return  int             erstellerId
     * @throws  RemoteException
     */
    public int getErstellerId() throws RemoteException {
        return this.erstellerId;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.190126FE-84AB-D522-708D-1ACB6A45BDAD]
    // </editor-fold> 
    /**
     * Setzt die {@link Person}-ID des Erstellers.
     *
     * @param   erstellerId
     * @throws  RemoteException
     */
    public void setErstellerId(int erstellerId) throws RemoteException {
        this.erstellerId = erstellerId;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.EE3A27F8-36F4-E97F-5E4E-6EDB478E70E4]
    // </editor-fold> 
    /**
     * Gibt die ID des verknüpften {@link Kalender} zurück.
     *
     * @return  int             kalenderId
     * @throws  RemoteException
     */
    public int getKalenderId() throws RemoteException {
        return this.kalenderId;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.07ACFE6A-21FE-99E4-2DAE-881DEC8A475C]
    // </editor-fold> 
    /**
     * Setzt eine neue {@link Kalender}-ID.
     *
     * @param   kalenderId
     * @throws  RemoteException
     */
    public void setKalenderId(int kalenderId) throws RemoteException {
        this.kalenderId = kalenderId;
    }

    /**
     * Gibt einen eindeutigen Identifikations-String zu Anzeige in der GUI zurück.
     *
     * @return  String          IdentifikationsName
     * @throws  RemoteException
     */
    public String ermittleIdentifikationsName() throws RemoteException {
        return "[" + kalendereintragId + "] " +
                datumZuString(start, ende) + " " + titel;
    }

    /**
     * Gibt einen eindeutigen Identifikations-String zu Anzeige in der GUI zurück,
     * wenn der Kalendereintrag eine Wiederholung ist wird ein "W" angefügt,
     * wenn es ein Termin ist ein "T"
     *
     * @param   istWiederholung
     * @return  String          IdentifikationsName
     * @throws  RemoteException
     */
    public String ermittleIdentifikationsName(boolean istWiederholung) throws
            RemoteException {
        if (istWiederholung) {
            return "[W:" + kalendereintragId + "] " +
                    datumZuString(start, ende) + " " + titel;
        }
        return "[T:" + kalendereintragId + "] " +
                datumZuString(start, ende) + " " + titel;
    }

    /**
     * Wandelt Start- und Enddatum in einen String um.
     * @param   start
     * @param   ende
     * @return  String Start- und Enddatum als String.
     */
    private String datumZuString(Timestamp start, Timestamp ende) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm");

        /**
         * Wenn Enddatum leer ist, nur das Startdatum ausgeben.
         */
        if (ende == null) {
            return dateFormat.format(start);
        }
        return dateFormat.format(start) + " - " + dateFormat.format(ende);
    }
}
